"""
 上一节简述了类属性的使用，发现普通的方法是无法使用类属性的，
 只有类方法才可以使用。这个和java中一样，只有静态方法 可以使用静态变量

 类方法 ：
    类方法其实就是一个特殊的普通方法，所以可以通过实例访问
    类方法可以直接通过类对象访问，普通方法不能通过类对象访问
    当方法中需要使用类对象（如访问私有类属性）时候，定义类方法
    类方法一般配合类属性使用，第一个参数必须是类对象，一般写cls
    @classmethod
    def xxx(cls):
        ....

静态方法：
    同样可以通过类对象和 实例对象访问静态方法
    场景：适用于即不需要实例对象（实例属性，实例对象）
        也不需要类对象（类属性，类对象）的时候使用成员方法
        没有实例对象无法访问实例的属性
        没有类对象无法访问类属性
    写法：
        @staticmethod
        def xxx():
            ....
    好处：取消不必要的参数传递，有利于减少不必要的内存消耗和性能消耗
"""

print("---------------- 类方法 -------------------")
class Dog():
    # 私有类对象
    __tooth = 10

    @classmethod
    def getTooth(cls):
        return cls.__tooth

    def getInfo(self):
        return f"牙齿有{self.__tooth}个"

# 通过实例对象访问类方法和普通方法
dog = Dog()
print(dog.getTooth())
print(dog.getInfo())

print(Dog.getTooth())
#print(Dog.getInfo()) 普通方法不能通过对象访问


print("---------------- 静态方法 -------------------")
class Cat():
    # 普通方法必须要带一个参数self，或者cls，但是静态方法不用
    @staticmethod
    def info_print():
        print("我是一只猫，我喜欢吃鱼")
cat = Cat()
# 静态方法可以通过类对象调用，也可以通过实例对象调用
Cat.info_print()
cat.info_print()
